<template></template>
<style scoped></style>
<script lang="ts">
// 1. 数组去重与排序
// 需求：实现一个函数，接收一个数字数组，返回去重后按从小到大排序的新数组。
// 示例：输入 [3, 1, 2, 2, 3, 1] → 输出 [1, 2, 3]
function sortArray1(arr: number[]) {
   let obj1:temobj1 = {};
   let temparr: number[] = [];
   arr.reduce((lastobj: Object, value: number) => {
      if (!lastobj.hasOwnProperty(String(value))) {
         temparr.push(value);
         lastobj[String(value)] = 1;
      } else {
         lastobj[String(value)]++;
      }
      return lastobj;
   }, obj1)
   temparr.sort((a, b) => {
      return a - b;
   })
   return temparr;
}
// 2. 斐波那契数列生成
// 需求：实现一个函数，接收一个数字 n，返回包含前 n 个斐波那契数的数组（斐波那契数定义：第 1、2 个数为 1，后续每个数等于前两个数之和）。
// 示例：输入 5 → 输出 [1, 1, 2, 3, 5]
function fbArray(n: number): Array<number> {
   n=n-1;
   if (n == 0) {
      return [1]
   } else if (n == 1) {
      return [1, 1];
   }
   let arr = [1, 1];

   for (let i = 2; i <= n; i++) {
      arr.push(arr[i - 1] + arr[i - 2]);
   }
   return arr;
}
// 3. 字符串反转与判断回文
// 需求：实现两个函数：
// - reverseStr(str)：返回反转后的字符串；
// - isPalindrome(str)：利用 reverseStr 判断字符串是否为回文（正读和反读一致，忽略大小写）。
// 示例：isPalindrome("Level") → true，isPalindrome("Hello") → false
function reverseStr(str:string):string{
   let tempstr=str.split('').reverse().join('');
   //console.log(tempstr);
   return tempstr
}
//reverseStr("asdfghjkqwertyui")
function isPalindrome(str:string){
   if(reverseStr(str).toLowerCase()===str.toLowerCase()){
      console.log("是")
   }else{
      console.log("不是")
   }
}
// isPalindrome("Sbs")

// 4. 数组元素频率统计
// 需求：实现一个函数，接收一个字符串数组，返回一个对象，键为数组中的元素，值为该元素出现的次数。
// 示例：输入 ["a", "b", "a", "c", "b", "a"] → 输出 { a: 3, b: 2, c: 1 }
interface temobj1{
[propName:string]:any;
}
function countArray(arr:Array<string>){
   let tempobj:temobj1={}
   arr.reduce((ini:object,val:string)=>{
      console.log(val);
      if(ini[val]){
         ini[val]++;
      }else{
         ini[val]=1;
      }
      return ini;
   },tempobj)
return tempobj
}
// 5. 两数之和
// 需求：实现一个函数，接收一个数字数组和一个目标值，返回数组中两个相邻元素之和等于目标值的索引（假设只有唯一解）。
// 示例：输入 [2, 7, 11, 15] 和 9 → 输出 [0, 1](双循环)
function numSum(arr1:number[],num1:number){
for(let i=0;i<arr1.length-1;i++){
   for(let j=i+1;j<arr1.length;j++){
      if((arr1[i]+arr1[j])===num1){
         return [i,j]
      }
   }
}
console.log("没有");
return null;
}
// 6. 数字累加器
// 需求：实现一个函数 
// createAccumulator(initialValue)，返回一个新函数，每次调用新函数时传入一个数字，累加后返回当前总和。
let total1=0
function createAccumulator(val:number){
total1+=val;
return total1;
}
// 7. 数组扁平化
// 需求：实现一个函数，将多层嵌套的数组扁平化为一维数组（只处理一层嵌套即可）。
// 示例：输入 [1, [2, 3], [4, [5]], 6] → 输出 [1, 2, 3, 4, [5], 6]

function reduceArrayLevel(array:any,temparr:number[]){
array.map((value:any)=>{
      if(Array.isArray(value)){
          reduceArrayLevel(value,temparr);
      }else{
         console.log(value)
        temparr.push(value);
      }
})
}
// let arr1:number[]=[];
// reduceArrayLevel([1, [2, 3], [4, 5], 6,[8,[54,33]]],arr1)
// console.log(arr1)
// 8. 过滤对象属性
// 需求：实现一个函数，接收一个对象和一个字符串数组（属性名），返回一个只包含该数组中属性的新对象。
// 示例：
// 输入对象 { name: "Alice", age: 20, gender: "female" } 和属性数组 ["name", "age"] 
// → 输出 { name: "Alice", age: 20 }
function filterObj(obj1:temobj1,arr1:string[]):object{
   let newobj1:temobj1={};
   for(let key of arr1){
      newobj1[key]=obj1[key];
   }
   return newobj1;
}
// 9. 区间重叠判断
// 需求：实现一个函数，接收两个区间 
// [start1, end1] 和 
// [start2, end2]，判断它们是否重叠（包含边界接触）。
// 示例：
// 输入 [1, 3] 和 [2, 4] → true；
// 输入 [1, 2] 和 [3, 4] → false
function gapDecision([start1,end1],[start2,end2]){
if(end1<start2||end2<start1){
   console.log("不重叠")
}else{
   console.log("重叠")
}
}

// 10. 学生成绩统计
// 需求：定义 Student 接口（
// 包含 name: string 和 score: number），
// 实现一个函数，接收 Student 数组，返回成绩最高的学生姓名
// （若有并列，返回第一个）。
// 示例：
// 输入 [{ name: "Tom", score: 85 }, \
// { name: "Jerry", score: 92 }, 
// { name: "Bob", score: 92 }] → 输出 "Jerry
interface Student{
   name:string;
   score:number;
}
function highestStu(stu:Array<Student>):string{
   let tempobj:Student={name:"",score:0};
   stu.reduce((obj,value)=>{
   if(value.score>obj.score){
      obj.score=value.score;
      obj.name=value.name;
   }
   return obj;
   },tempobj)
   return tempobj.name
}
</script>typescript 10道练习题
